package org.com.behavioralPattern.mementoPattern;

/**
 * 备忘录模式-模拟颁布控制
 * @author Jonny
 * @version 1.0
 * @Description:
 * @date 2021/4/27 17:27
 */

/**
 *
 * ■ 需要保存和恢复数据的相关状态场景。
 * ■ 提供一个可回滚的操作。
 * ■ 需要监控副本的场景。
 * 例如，监控一个对象的属性，但是监控又不应该作为系统的主业务来调用，它只是边缘应用，
 * 即使出现监控不准、错误报警也影响不大，因此一般做法是备份一个主线程中的对象，然后由分析程序来分析。
 * ■ 数据库连接的事务管理使用的就是备忘录模式。
 *
 * ■ 备忘录的生命周期，备忘录创建出来就要在最近的代码中使用，
 * 要主动管理它的生命周期，建立就要使用，不使用就要立刻删除其引用，等待垃圾回收器对它的回收处理。
 * ■ 备忘录的性能。不要在频繁建立备份的场景中使用备忘录模式，
 * 例如，for循环中，
 * 一是控制不了备忘录建立的对象数量；
 * 二是大对象的建立是要消耗资源的，需要考虑系统的性能。
 * 因此，如果出现这样的代码，设计师应该修改架构。
 *
 */
public class Test {
    public static void main(String[] args) {
        VersionControlSystem vcs=new VersionControlSystem();
        Document document=new Document();
        document.content="需要保存一下的文本信息";
        document.otherContent="otherContent1";
        System.out.println(document);
        vcs.AddBack(document.save());
        document.content="我做了一次修改";
        document.otherContent="othercontent2";
        System.out.println(document);
        vcs.AddBack(document.save());
        document.content="我做了第二次修改";
        document.otherContent="othercontent3";
        System.out.println(document);
        vcs.AddBack(document.save());
        System.out.println("===================恢复到第一个版本===================");
        document.resume(vcs.getBackup(1));
        System.out.println(document);
        System.out.println("===================切换到最后一个版本===================");
        document.resume(vcs.getlastBackup());
        System.out.println(document);
    }
}
